package yolorpc.utils;


import cn.hutool.core.util.StrUtil;
import cn.hutool.setting.dialect.Props;
import io.netty.util.Constant;
import yolorpc.constant.RpcConstant;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @author yolo
 * @Program RPC
 * @description 配置工具类
 * @create 2025-04-24 11:19
 **/
public class ConfigUtils {

    /**
     * 加载配置对象
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix) {
        return loadConfig(tClass, prefix, "");
    }

    /**
     * 加载配置对象，支持区分环境
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix, String environment) {
        StringBuilder configFileBuilder = new StringBuilder("application");

        if (StrUtil.isNotBlank(environment)) {
            configFileBuilder.append("-").append(environment);
        }
        // 加载yaml/yml格式配置文件
        Props props = new Props();
        Props finalProps = new Props();
        for (String ext : Arrays.asList(".yaml", ".yml")){
            try {
                props.putAll(new Props(configFileBuilder.append(ext).toString()));
                props.forEach((k, v) -> finalProps.setProperty(RpcConstant.DEFAULT_CONSTANT_PREFIX + "." + k.toString(), v));
            } catch (Exception ignored){} finally {
                configFileBuilder.delete(configFileBuilder.length() - ext.length(), configFileBuilder.length());
            }
        }
        // 加载properties格式配置文件
        try {
            finalProps.putAll(new Props(configFileBuilder.append(".properties").toString()));
        } catch (Exception e){
            throw new RuntimeException("配置文件出错。");
        }
        return finalProps.toBean(tClass,prefix);
    }
}
